import axios from 'axios';
import { axiosConfig } from './config';

// 创建一个axios实例
const api = axios.create(axiosConfig);

// 本地存储token的键名
const TOKEN_KEY = 'auth_token';

// 获取token
export const getToken = () => {
  return localStorage.getItem(TOKEN_KEY);
};

// 保存token
export const setToken = (token) => {
  localStorage.setItem(TOKEN_KEY, token);
};

// 移除token
export const removeToken = () => {
  localStorage.removeItem(TOKEN_KEY);
};

// 请求拦截器
api.interceptors.request.use(
  config => {
    // 获取token
    const token = getToken();
    // 如果token存在，则添加到请求头
    if (token) {
      config.headers['Authorization'] = token;
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

/**
 * 用户登录
 * @param {Object} data - 登录参数
 * @param {string} data.username - 用户名
 * @param {string} data.password - 密码
 * @returns {Promise<Object>} 登录结果
 */
export const login = async (data) => {
  try {
    // 调用后端登录接口
    const response = await api.post('/auth/login', data);
    
    // 登录成功，保存token
    if (response.data && response.data.success && response.data.data && response.data.data.token) {
      setToken(response.data.data.token);
      
      // 保存用户名，用于显示在界面上
      if (response.data.data.username || response.data.data.nickname) {
        localStorage.setItem('username', response.data.data.username || response.data.data.nickname);
      }
    }
    
    return response.data;
  } catch (error) {
    console.error('登录失败:', error);
    // 如果服务器返回了错误信息，使用服务器的错误信息
    if (error.response && error.response.data) {
      return error.response.data;
    }
    // 否则返回一个通用错误
    return {
      success: false,
      message: error.message || '登录请求失败，请检查网络连接'
    };
  }
};

/**
 * 用户注册
 * @param {Object} data - 注册参数
 * @param {string} data.username - 用户名
 * @param {string} data.email - 邮箱
 * @param {string} data.password - 密码
 * @returns {Promise<Object>} 注册结果
 */
export const register = async (data) => {
  try {
    // 调用后端注册接口
    const response = await api.post('/auth/register', data);
    
    // 注册成功，保存token
    if (response.data && response.data.success && response.data.data && response.data.data.token) {
      setToken(response.data.data.token);
      
      // 保存用户名，用于显示在界面上
      if (response.data.data.username || response.data.data.nickname) {
        localStorage.setItem('username', response.data.data.username || response.data.data.nickname);
      }
    }
    
    return response.data;
  } catch (error) {
    console.error('注册失败:', error);
    // 如果服务器返回了错误信息，使用服务器的错误信息
    if (error.response && error.response.data) {
      return error.response.data;
    }
    // 否则返回一个通用错误
    return {
      success: false,
      message: error.message || '注册请求失败，请检查网络连接'
    };
  }
};

/**
 * 检查用户是否已登录
 * @returns {boolean} 是否已登录
 */
export const isLoggedIn = () => {
  return !!getToken();
};

/**
 * 获取当前登录用户信息
 * @returns {Promise<Object>} 用户信息
 */
export const getCurrentUser = async () => {
  try {
    // 调用后端获取当前用户信息接口
    const response = await api.get('/user/current');
    return response.data;
  } catch (error) {
    console.error('获取用户信息失败:', error);
    // 如果是401错误，说明token已失效，清除本地token
    if (error.response && error.response.status === 401) {
      removeToken();
    }
    return {
      success: false,
      message: error.message || '获取用户信息失败'
    };
  }
};

/**
 * 用户退出登录
 * @returns {Promise<Object>} 退出结果
 */
export const logout = async () => {
  try {
    // 调用后端登出接口
    const response = await api.post('/auth/logout');
    
    // 无论成功与否，清除本地token
    removeToken();
    localStorage.removeItem('username');
    
    return response.data;
  } catch (error) {
    console.error('退出登录失败:', error);
    
    // 即使请求失败，也清除本地token
    removeToken();
    localStorage.removeItem('username');
    
    // 返回错误信息
    return {
      success: false,
      message: error.message || '退出登录失败'
    };
  }
};

// 导出api实例，以便其他模块可以使用
export default api; 